import numpy as np

# ========= 矩阵运算（注意Python的矩阵索引从0开始） =========
print(np.array([1, 2, 3]))        # 创建矩阵
print(np.mat(np.zeros((2, 4))))   # 注意传入的参数
print(np.mat(np.random.rand(2, 2)))
print(np.mat(np.random.randint(10, size = (3, 3))))
print(np.mat(np.random.randint(2, 8, size = (3, 3))))
print(np.mat(np.eye(2, 2, dtype = int)))
print(np.mat(np.diag([1, 2, 3])))

print(np.mat([1, 2]) * np.mat([[1], [2]]))      # 矩阵叉乘
print(np.multiply(np.mat([1,1]),np.mat([2,3]))) # 矩阵点乘
print(np.mat(np.diag([2, 4])).I)                # 矩阵求逆
print(np.mat(np.diag([2, 4])).T)                # 矩阵转置

# 参考矩阵 m:           n:
#       [ 1  1 ]     [ 1  1  1 ]
#       | 2  3 |     [ 1  1  1 ]
#       [ 4  2 ]     [ 1  1  1 ]

m = np.mat([[1, 1], [2, 3], [4, 2]])
print(m.sum(axis = 0))          # 列和
print(m.sum(axis = 1))          # 行和

print(sum(m))                   # 列和运算
print(sum(m[1: ]))              # 第2行开始的列和
print(m.max())
print(max(m[:, 1]))             # 第2列的最大值（返回矩阵）
print(m[1, :].max())            # 第2行的最大值（返回具体值）
print(np.max(m, 0))             # 各列最大值
print(np.max(m, 1))             # 各行最大值

print(np.argmax(m, 0))          # 各列最大值在该列中的索引
print(np.argmax(m, 0))          # 各行最大值在该行中的索引

n = np.mat(np.ones((3, 3)))
print(n[1:, 1:])                # 分割出第2行以后的行和第2列以后的列的所有元素
print(np.vstack((np.mat(np.ones((2,2))), np.mat(np.eye(2)))))   # 按列合并，拓展行数
print(np.hstack((np.mat(np.ones((2,2))), np.mat(np.eye(2)))))   # 按行合并，拓展列数

# 数组Array的相关属性
print(np.array([[2], [1]]).ndim)        # 维度
print(np.array([[2], [1]]).shape)       # 各维度大小
print(np.array([[2], [1]]).size)        # 元素总数
print(np.array([[2], [1]]).dtype)       # 元素类型

# 相互转换
a1 = [[1, 2], [3, 2], [5, 2]]  # 列表
a2 = np.array(a1)              # 将列表转换为二维数组/矩阵
print(a2)
a3 = np.array(a2)              # 将矩阵转换为数组
print(a3)
a4 = a2.tolist()               # 将矩阵转换为列表
print(a4)
a5 = a3.tolist()               # 将数组转换为列表
print(a5)